/*
 * Copyright (C) 2012 POAS.VSTU
 */
package ui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import model.Card;
import model.Face;
import model.Player;

/**
 * UI-представлние игрока-человека
 */
public class UIGamer extends UIPlayer implements MouseListener, ActionListener, ItemListener{

    /** Кнопка "Выложить карты". */
    private JButton mLayCardsButton;

    /** Кнопка "верю". */
    private JButton mBelieveButton;

    /** Кнопка "не верю". */
    private JButton mDisbelieveButton;

    public UIGamer(Player player, UIGamePanel gamePanel) {
        super(player, gamePanel);
        mLayCardsButton = new JButton("Выложить карты");
        mLayCardsButton.addActionListener(this);
        mLayCardsButton.setVisible(false);
        gamePanel.add(mLayCardsButton);

        mBelieveButton = new JButton("Верю");
        mBelieveButton.addActionListener(this);
        mBelieveButton.setVisible(false);
        gamePanel.add(mBelieveButton);

        mDisbelieveButton = new JButton("Не верю");
        mDisbelieveButton.addActionListener(this);
        mDisbelieveButton.setVisible(false);
        gamePanel.add(mDisbelieveButton);
    }
    /** Слушатель события щелчка по карте игрка-человека. */
    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getSource() instanceof UICard) {
            UICard uicard = (UICard) e.getSource();
            if (uicard.isClickable()) {
                // Если сигнал пришел от карты на руках
                if (getUICardPile().getModel().contains(uicard.getModel())) {
                    if (getUICardPile().getModel().switchCard(uicard.getModel())) {
                        mLayCardsButton.setEnabled(true);
                        mLayCardsButton.setText("Выложить карты");
                    }
                    else {
                        // сделать активной кнопку Выложить карты, если выбрана хотя бы 1 карта
                        if (getUICardPile().mModel.selectedCardsCount() > 0) {
                            mLayCardsButton.setEnabled(true);
                            mLayCardsButton.setText("Выложить карты");
                        }
                        else {
                            mLayCardsButton.setEnabled(false);
                            mLayCardsButton.setText("Выберите карты");
                        }
                    }
                }
            }
        }
    }

    /** Задать позицию игрока, его карт и виджетов игрока. */
    @Override
    public void setLocation(Point p) {
        super.setLocation(p);

        // Требуется уточнение, где размещать кнопки.
        int width = getPanel().getWidth();
        mLayCardsButton.setBounds(width / 2 - 80, p.y - 80, 160, 30);
        mBelieveButton.setBounds(width / 2 - 170, p.y - 80, 160, 30);
        mDisbelieveButton.setBounds(width / 2 + 10, p.y - 80, 160, 30);
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    /** Слушатель события нажатия виджетов. */
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == mLayCardsButton) {
            // Если сигнал пришел от кнопки выкладывания карт

            // Сразу скрыть кнопку
            mLayCardsButton.setVisible(false);

            getPanel().paintImmediately(mLayCardsButton.getBounds());
            // Сообщить модели игры, что нужно выложить карты игрока
            getPanel().getModel().movePlayerCardsToKitty(this.getModel());
            
            // Завершить ход
            endTurn();
            getModel().endTurn();
        }
        if (e.getSource() == mBelieveButton) {
            // Если нажата кнопка Верить

            // Скрыть кнопки
            mBelieveButton.setVisible(false);
            mDisbelieveButton.setVisible(false);

            // Показать кнопку Выложить карты, но сделать ее неактивной
            mLayCardsButton.setVisible(true);
            mLayCardsButton.setEnabled(false);
            mLayCardsButton.setText("Выберите карты");

            // Показать подсказку с решением игрока.
            showBelieveLabel();

            getModel().believe();

            // активировать карты игрока
            enableGamerCards();
        }
        if (e.getSource() == mDisbelieveButton) {
            // Если нажата кнопка Не верить

            // Скрыть кнопки
            mBelieveButton.setVisible(false);
            getPanel().paintImmediately(mBelieveButton.getBounds());
            mDisbelieveButton.setVisible(false);
            getPanel().paintImmediately(mDisbelieveButton.getBounds());

            // Сделать активными карты на кону
            ((UICardPileKitty)getPanel().getUICardPile(getModel().getModel().getKitty())).activateLastCards();

            // Показать подсказку с решением игрока.
            showDisbelieveLabel();
            getModel().disbelieve();
        }
    }

    /** Кнопка "Выложить карты". */
    public JButton getLayCardsButton() {
        return mLayCardsButton;
    }

    /** Активация карт игрока. */
    public void enableGamerCards() {
        for (Card c : getUICardPile().mModel) {
            getPanel().getUICard(c).setClickable(true);
        }
    }

    /** Деактивация карт игрока. */
    public void disableGamerCards() {
        for (Card c : getUICardPile().mModel) {
            getPanel().getUICard(c).setClickable(false);
        }
    }

    /** Действия при начале захода игроком. */
    @Override
    public void startRound() {
        super.startRound();
        enableGamerCards();
        mLayCardsButton.setVisible(true);
        mLayCardsButton.setEnabled(false);
        mLayCardsButton.setText("Выберите карты");
        getPanel().setRankEnabled(true);
        // Предложить выбрать карты для сброса на кон
    }

    /** Действия при продолжении захода игроком. */
    @Override
    public void continueRound() {
        super.continueRound();
        // Предложить выбор верить или не верить
        if (getModel().getCards().size() == 0) {
            mBelieveButton.setEnabled(false);
        }
        mBelieveButton.setVisible(true);
        mDisbelieveButton.setVisible(true);
        ((UICardPileKitty)getPanel().getUICardPile(getModel().getModel().getKitty())).deactivateLastCards();
    }

    /**
     * Убрать с экрана признаки активности игрока.
     */
    @Override
    public void endTurn() {
        super.endTurn();

        // Деактивировать доступные игроку карты
        disableGamerCards();
        ((UICardPileKitty)getPanel().getUICardPile(getModel().getModel().getKitty())).deactivateLastCards();

        // Скрыть все элементы управления
        mBelieveButton.setVisible(false);
        getPanel().paintImmediately(mBelieveButton.getBounds());
        mDisbelieveButton.setVisible(false);
        getPanel().paintImmediately(mDisbelieveButton.getBounds());
        mLayCardsButton.setVisible(false);
        getPanel().paintImmediately(mLayCardsButton.getBounds());
        mBelieveButton.setEnabled(true);

        getPanel().setRankEnabled(false);
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        // Если сигнал пришел от виджета выбора ранга
        if (e.getSource() == getPanel().getRankComboBox() && getPanel().getRankComboBox().isEnabled()) {
            if (getPanel().getRankComboBox().getSelectedItem() == e.getItem()) {
                // Задать ранг карт на кону
                getModel().getModel().setRank(getPanel().getFaceByLabel(e.getItem().toString()));
            }

        }
    }
}
